package com.hutu.util;

import java.util.HashMap;
import java.util.Map;

public class CommonUtil {


    /**
     * 下划线转驼峰
     *
     * @param columnName 下划线分隔的字符串
     * @return 转换为驼峰命名法的字符串
     */
    public static String transferCamel(String columnName) {
        if (columnName == null || columnName.isEmpty()) {
            return "";
        }

        StringBuilder camelCase = new StringBuilder();
        boolean isUpper = false; // 标记是否需要转换为大写

        for (int i = 0; i < columnName.length(); i++) {
            char c = columnName.charAt(i);

            if (c == '_') {
                isUpper = true; // 遇到下划线，下一个字符需要转换为大写
            } else if (isUpper) {
                camelCase.append(Character.toUpperCase(c)); // 转换为大写并追加到结果字符串中
                isUpper = false; // 重置标记
            } else {
                camelCase.append(Character.toLowerCase(c)); // 直接追加小写字符
            }
        }

        // 如果字符串以大写字母开头，则将其转换为小写（可选）
        if (Character.isUpperCase(camelCase.charAt(0))) {
            camelCase.setCharAt(0, Character.toLowerCase(camelCase.charAt(0)));
        }

        return camelCase.toString();
    }

    /**
     * 首字母变大写
     * @param tableNameNoUnder
     * @return
     */
    public static Object firstUpper(String tableNameNoUnder) {
        return String.valueOf(tableNameNoUnder.charAt(0)).toUpperCase() + tableNameNoUnder.substring(1);
    }

    static class TypeConverter {

        // 创建一个映射，将JDBC类型映射到Java类型
        private static final Map<String, String> jdbcToJavaTypeMap = new HashMap<>();
        static {
            jdbcToJavaTypeMap.put("VARCHAR", "String");
            jdbcToJavaTypeMap.put("CHAR", "String");
            jdbcToJavaTypeMap.put("INT", "Integer");
            jdbcToJavaTypeMap.put("BIGINT", "Long");
            jdbcToJavaTypeMap.put("SMALLINT", "Short");
            jdbcToJavaTypeMap.put("TINYINT", "Byte");
            jdbcToJavaTypeMap.put("FLOAT", "Float");
            jdbcToJavaTypeMap.put("DOUBLE", "Double");
            jdbcToJavaTypeMap.put("DECIMAL", "BigDecimal");
            jdbcToJavaTypeMap.put("BOOLEAN", "Boolean");
            jdbcToJavaTypeMap.put("DATE", "Date");
            jdbcToJavaTypeMap.put("DATETIME", "Date");
            jdbcToJavaTypeMap.put("TIME", "Date");
            jdbcToJavaTypeMap.put("TIMESTAMP", "Date");
            // 可以继续添加其他类型...
        }

        /**
         * 将JDBC类型转换为Java类型
         * @param columnType：可能的值：varchar(50)等
         * @return Java类型名称
         */
        public static String transferJdbcType2java(String columnType) {
            // 移除括号及其内容（如果有的话），因为它们对于确定Java类型不是必要的
            String baseType = columnType.toUpperCase().replaceAll("\\(.*\\)", "");

            // 查找并返回相应的Java类型
            return jdbcToJavaTypeMap.getOrDefault(baseType.toUpperCase(), "String"); // 如果未找到，则默认为String
        }

    }

    public static String transformUnderscoreToCamelCase(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        if(input.startsWith("t_")) {
            input = input.substring(2);
        }

        String[] parts = input.split("_");
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < parts.length; i++) {
            if (parts[i].isEmpty()) continue;

            if (i == 0) {
                // 首部分保持小写
                result.append(parts[i].toLowerCase());
            } else {
                // 后续部分首字母大写，其他字母保持原样
                if (!parts[i].isEmpty()) {
                    result.append(Character.toUpperCase(parts[i].charAt(0)));
                    if (parts[i].length() > 1) {
                        result.append(parts[i].substring(1).toLowerCase());
                    }
                }
            }
        }
        return result.toString();
    }

    /**
     * jdbc类型转换为java类型
     * @param columnType：可能的值：varchar(50)等
     * @return
     */
    public static String transferJdbcType2java(String columnType) {
        return TypeConverter.transferJdbcType2java(columnType);
    }
}
